/*
 *@Type RandomAccessFileUtil.java
 * @Desc
 * @Author urmsone urmsone@163.com
 * @date 2024/6/13 02:58
 * @version
 */
package utils;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.charset.StandardCharsets;

/**
 * 封装了对文件的读写操作
 */
public class RandomAccessFileUtil {

    private static final String RW_MODE = "rw";

    /***
     * 将字节数组 value 写入到指定路径 filePath 的文件中。
     * @param filePath
     * @param value
     * @return
     */
    public static int write(String filePath, byte[] value) {
        RandomAccessFile file = null;
        //始化文件长度变量。
        long len = -1L;
        try {
            //以读写模式打开文件
            file = new RandomAccessFile(filePath, RW_MODE);
            //获取文件当前长度
            len = file.length();
            //文件指针移动到文件末尾
            file.seek(len);
            //写入字节数组value
            file.write(value);
            file.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        //返回写入位置（文件原长度)
        return (int)len;
    }

    /**
     * 从头开始写
     * @param filePath
     * @param value
     * @return
     */
    public static int writeInHead(String filePath, byte[] value) {
        RandomAccessFile file = null;
        //始化文件长度变量。
        long len = -1L;
        try {
            //以读写模式打开文件
            file = new RandomAccessFile(filePath, RW_MODE);
            // 清空文件内容
            file.setLength(0);
            //写入字节数组value
            file.write(value);
            file.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        //返回写入位置（文件原长度)
        return (int)len;
    }

    /**
     * 将整数 value 写入到指定路径 filePath 的文件中。
     * @param filePath
     * @param value
     */
    public static void writeInt(String filePath, int value) {
        RandomAccessFile file = null;
        long len = -1L;
        try {
            file = new RandomAccessFile(filePath, RW_MODE);
            len = file.length();
            file.seek(len);
            file.writeInt(value);
            file.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 用于从指定路径filePath的文件中，从`index`位置读取长度为`len`的字节数组。
     * @param filePath 文件路径
     * @param index 读取的字节数组开头
     * @param len 读取的字节数组的长度
     * @return
     */
    public static byte[] readByIndex(String filePath, int index, int len) {
        RandomAccessFile file = null;
        byte[] res = new byte[len];
        try {
            file = new RandomAccessFile(filePath, RW_MODE);
            file.seek((long)index);
            //读取`len`个字节到字节数组res`中。
            file.read(res, 0, len);
            return res;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                file.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

}
